package pfc.aviloc.aplicacion.enfermedades;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;

import pfc.aviloc.R;
import android.content.Context;


public class EnfermedadesParseador extends DefaultHandler {
	
	ArrayList<Enfermedades> listaEnfermedades;
	Enfermedades enfermedad;
	boolean error;
	String tipoError;
	Context context;
	int etiqueta;	
	
	public EnfermedadesParseador(Context context) {
		this.context = context;
	}

	public ArrayList<Enfermedades> getEnfermedades(InputSource xml){
		listaEnfermedades = null;
		
		error=false;
		tipoError = context.getString(R.string.e_parseador_error_sin_errores);
		try {
			// Se utiliza SAX para parsear.
			SAXParserFactory spf = SAXParserFactory.newInstance();
			// spf.setValidating(true);
			//spf.setNamespaceAware(true);
			// spf.setFeature("http://xml.org/sax/features/validation" , true);			
			SAXParser sp = spf.newSAXParser();			
			XMLReader xr = sp.getXMLReader();
			xr.setContentHandler(this);
			// Se realiza el parseo.			
			xr.parse(xml);
		} catch (IOException e) {
			error=true;
			tipoError = context.getString(R.string.e_parseador_error_error_de_parseo);
			listaEnfermedades=null;
			e.printStackTrace();
		} catch (SAXException e) {
			error=true;
			tipoError = context.getString(R.string.e_parseador_error_error_de_parseo);
			listaEnfermedades=null;			
			e.printStackTrace();
		} catch (ParserConfigurationException e) {
			error=true;
			tipoError = context.getString(R.string.e_parseador_error_error_de_parseo);
			listaEnfermedades=null;
			e.printStackTrace();
		}        
        
		return listaEnfermedades;
	}
	
	// METODOS PROPIOS DEL DefaultHandler
//	@Override
//	public void startDocument() throws SAXException {
//		//super.startDocument();
//		Log.i("INFO","-->ENTRAMOS EN StartDocument()");				
//	}
//	
//	@Override
//	public void endDocument() throws SAXException {
//		//endDocument();
//		Log.i("INFO","-->ENTRAMOS EN endDocument()");		
//	}
	
	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		// TODO Auto-generated method stub
		//super.startElement(uri, localName, qName, attributes);
		//Log.i("INFO","---->ENTRAMOS EN startElement()");
		//Log.i("INFO","-------> uri="+uri+"; localName="+localName+"; qName="+qName+"; Attributes="+attributes+";");
		
		// Entramos en etiqueta <enfermedades>
		if (localName.equals(context.getString(R.string.e_parseador_etiqueta_enfermedades))) {
			etiqueta=R.string.e_parseador_etiqueta_enfermedades;
		}
		// Entramos en etiqueta <listaenfermedades>
		else if (localName.equals(context.getString(R.string.e_parseador_etiqueta_lista_enfermedades))) {
			etiqueta=R.string.e_parseador_etiqueta_lista_enfermedades;
			listaEnfermedades = new ArrayList<Enfermedades>();				
		}
		// Entramos en etiqueta <enfermedad>
		else if (localName.equals(context.getString(R.string.e_parseador_etiqueta_enfermedad))) {
			etiqueta=R.string.e_parseador_etiqueta_enfermedad;
			enfermedad = new Enfermedades();			
		}
		// Entramos en etiqueta <idenfermedad>
		else if (localName.equals(context.getString(R.string.e_parseador_etiqueta_id_enfermedad))) {
			etiqueta=R.string.e_parseador_etiqueta_id_enfermedad;
		}
		// Entramos en etiqueta <nombre>
		else if (localName.equals(context.getString(R.string.e_parseador_etiqueta_nombre))) {
			etiqueta=R.string.e_parseador_etiqueta_nombre;
		}
		// Entramos en etiqueta <descripcion>
		else if (localName.equals(context.getString(R.string.e_parseador_etiqueta_descripcion))) {
			etiqueta=R.string.e_parseador_etiqueta_descripcion;
		}
		// Entramos en etiqueta <fechainicio>
		else if (localName.equals(context.getString(R.string.e_parseador_etiqueta_fecha_inicio))) {
			etiqueta=R.string.e_parseador_etiqueta_fecha_inicio;
		}
		// Entramos en etiqueta <fechafin>
		else if (localName.equals(context.getString(R.string.e_parseador_etiqueta_fecha_fin))) {
			etiqueta=R.string.e_parseador_etiqueta_fecha_fin;
		}	
		// Entramos en etiqueta <error>
		else if (localName.equals(context.getString(R.string.e_parseador_etiqueta_error))) {
			etiqueta=R.string.e_parseador_etiqueta_error;
		}
		// Entramos en etiqueta <tipoerror>
		else if (localName.equals(context.getString(R.string.e_parseador_etiqueta_tipo_error))) {
			etiqueta=R.string.e_parseador_etiqueta_tipo_error;
		}

	}
	
	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
		// TODO Auto-generated method stub
		//super.characters(ch, start, length);
		//Log.i("INFO","---->ENTRAMOS EN characters()");
		String cadena = new String(ch, start, length);
		//Log.i("INFO","-------> ch="+cadena+"; start="+start+"; length="+length+";");
		
		switch (etiqueta){
//		  case R.string.cm_parseador_etiqueta_lista_citas_medico:
//			  break;
//		  case R.string.cm_parseador_etiqueta_lista_citas:
//			  break;
//		  case R.string.cm_parseador_etiqueta_cita_medico:
//			  break;
		  case R.string.e_parseador_etiqueta_id_enfermedad:
			  enfermedad.setIdEnfermedad(cadena);
			  break;
		  case R.string.e_parseador_etiqueta_nombre:
			  enfermedad.setNombre(cadena);
			  break;
		  case R.string.e_parseador_etiqueta_descripcion:
			  enfermedad.setDescripcion(cadena);
			  break;			  
		  case R.string.e_parseador_etiqueta_fecha_inicio:
			  enfermedad.setFechaInicio(cadena);
			  String[] fecha = cadena.split("-");
			  enfermedad.setFechaInicioDia(fecha[0]);
			  enfermedad.setFechaInicioMes(fecha[1]);
			  enfermedad.setFechaInicioAno(fecha[2]);
			  break;
		  case R.string.e_parseador_etiqueta_fecha_fin:
			  enfermedad.setFechaFin(cadena);
			  String[] fechafin = cadena.split("-");
			  enfermedad.setFechaFinDia(fechafin[0]);
			  enfermedad.setFechaFinMes(fechafin[1]);
			  enfermedad.setFechaFinAno(fechafin[2]);
			  break;
		  case R.string.e_parseador_etiqueta_error:
			  if (cadena.equalsIgnoreCase(context.getString(R.string.e_parseador_respuesta_true))) {
				error = true;  
			  } else if (cadena.equalsIgnoreCase(context.getString(R.string.e_parseador_respuesta_false))){
				error = false;			  
			  } else {
				tipoError =context.getString(R.string.e_parseador_error_de_datos_etiqueta_error);
			  }
			  break;
		  case R.string.e_parseador_etiqueta_tipo_error:
			  if (error){
				  tipoError=cadena;
			  }
			  break;
//		  default:
//			  //NADA
		}
	}

	@Override
	public void endElement(String uri, String localName, String qName) throws SAXException {
		// TODO Auto-generated method stub
		//super.endElement(uri, localName, qName);
		//Log.i("INFO","---->ENTRAMOS EN endElement()");
		//Log.i("INFO","-------> uri="+uri+"; localName="+localName+"; qName="+qName+";");
		// Entramos en etiqueta <enfermedades>
		if (localName.equals(context.getString(R.string.e_parseador_etiqueta_enfermedades))) {
			if (error){
				listaEnfermedades = null;
			}			
		} 
		// Entramos en etiqueta <enfermedad>
		else if (localName.equals(context.getString(R.string.e_parseador_etiqueta_enfermedad))) {
			Date fechaActual = new Date();
			enfermedad.setFechaActualizacion( fechaActual.getDate()+"-"+(fechaActual.getMonth()+1)+"-"+(fechaActual.getYear()+1900)+" "+fechaActual.getHours()+":"+fechaActual.getMinutes());
			listaEnfermedades.add(enfermedad);
		} else {
			etiqueta = -1;
		}			
	}
}
